package com.bicon.botu.account.handler;

import com.alibaba.fastjson.JSON;
import com.bicon.botu.account.common.UserInfoConstants;
import com.bicon.botu.account.entity.UserInfo;
import com.bicon.botu.account.service.IUserInfoService;
import com.bicon.botu.core.base.bean.GlobalRedisTemplate;
import com.bicon.botu.core.base.common.utils.StringUtils;
import com.bicon.botu.core.base.repository.redis.RedisTemplateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * Redis 缓存用户信息类
 *
 * @Author: sx
 * @Date: Created in 14:31 2017/6/14/014
 */

@Component
public class UserInfoHandler {

    @Autowired
    private IUserInfoService userInfoService;

    @Autowired
    private GlobalRedisTemplate globalRedisTemplate;
    /**
     * 全局redis工具类
     */

    private RedisTemplateUtil globalRedisTemplateUtil;

    /**
     * 获取全局redis操作类
     *
     * @return
     */

    public RedisTemplateUtil getGlobalRedisTemplate() {
        if (globalRedisTemplateUtil == null) {
            globalRedisTemplateUtil = new RedisTemplateUtil(globalRedisTemplate);
        }
        return globalRedisTemplateUtil;
    }


    /**
     * 用户信息发生变化时将其保存在redis
     *
     * @param uid
     * @return
     */

    public void initUserInfo(String uid) {
        try {
            //移除存在的信息
            String value = getGlobalRedisTemplate().getStringValue(UserInfoConstants.BOTU_USER_USER_INFO, uid);
            if (StringUtils.isNotBlank(value)) {
                getGlobalRedisTemplate().remove(UserInfoConstants.BOTU_USER_USER_INFO, uid);
            }
            //查找新信息
            UserInfo userInfo = userInfoService.findUserInfoByUid(uid);
            if (userInfo == null) {
                return;
            }
            String userInfoStr = JSON.toJSONString(userInfo);
            //以String形式存储
            getGlobalRedisTemplate().cacheStringValue(UserInfoConstants.BOTU_USER_USER_INFO, uid, userInfoStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 初始化所有的用户信息到缓存中
     */
    public void initUserInfo() {
//      移除所有信息
        List<UserInfo> userInfos = userInfoService.findAll();
        for (UserInfo userInfo : userInfos) {
            String userInfoStr = JSON.toJSONString(userInfo);
            //以String形式存储
            getGlobalRedisTemplate().remove(UserInfoConstants.BOTU_USER_USER_INFO, userInfo.getId());
            getGlobalRedisTemplate().cacheStringValue(UserInfoConstants.BOTU_USER_USER_INFO, userInfo.getId(), userInfoStr);
        }
    }

    /**
     * 缓存用户id
     *
     * @param uid
     */
    public void initUserId(String uid) {
        List<String> userIds = getGlobalRedisTemplate().getList(UserInfoConstants.BOTU_USER_USERIDS, "");
        if (!CollectionUtils.isEmpty(userIds)) {
            getGlobalRedisTemplate().remove(UserInfoConstants.BOTU_USER_USERIDS, "");
        }
        userIds.add(uid);
        //去重
        userIds = new ArrayList<String>(new HashSet<String>(userIds));
        getGlobalRedisTemplate().cacheList(UserInfoConstants.BOTU_USER_USERIDS, "", userIds);

    }

    /**
     * 根据token 获取 id
     *
     * @param token
     * @return
     */

    public String getUidByToken(String token) {
        return getGlobalRedisTemplate().getStringValue(UserInfoConstants.BOTU_USER_TOKEN, token);

    }

    public String getAccount(String userId) {
        return getGlobalRedisTemplate().getStringValue(UserInfoConstants.BUTO_USER_ACCOUNT, userId);
    }

    public String getUserIdByAccount(String account) {
        return getGlobalRedisTemplate().getStringValue(UserInfoConstants.BOTU_USER_TOKEN, account);

    }
}
